/**
* @fileOverview 游戏实例资源管理器的源文件
* @author <a href="http://sivory.my.phpcloud.com">Sivory</a>
* @version 0
*/

/**
* @class 游戏资源管理器类。对游戏中的资源进行整合管理，并负责向游戏内核提供资源。
* @author <a href="http://sivory.my.phpcloud.com">Sivory</a>
* @version 0
*/
Name.Sivory.Opensea.Resource=function()
{
	var instance = this;
	
	/**
	* @field
	* @private
	* @description 资源哈希表
	* @type Name.Sivory.Opensea.HashTable
	* @since 0
	*/
	this.resource = new Name.Sivory.Opensea.HashTable();
	
	/**
	* @field
	* @private
	* @description 资源加载队列
	* @type Array
	* @since 0
	*/
	this.loadingQueue = [];
	
	/**
	* @function
	* @public
	* @description 将资源放入集合中
	* @param {String} key 资源在托管器中的索引
	* @param {Name.Sivory.Opensea.ResourceBase} resource 资源对象
	* @since 0
	*/
	this.put = function(key,resource){
		instance.resource.put(key,resource);
		instance.loadingQueue.push(resource);
	}
	
	/**
	* @function
	* @public
	* @description 从集合中取得资源
	* @param {String} key 目标资源的索引
	* @returns {Name.Sivory.Opensea.ResourceBase} 资源对象
	* @since 0
	*/
	this.get=function(key){
		return instance.resource.get(key);
	}
	
	
	this.containsKey=function(key){
		return instance.resource.containsKey(key);
	}
	
	/**
	* @function
	* @public
	* @description 清空资源集合
	* @since 0
	*/
	this.clear=function(){
		instance.resource.clear();
	}
	
	/**
	* @function
	* @public
	* @description 加载所有在集合中的资源
	* @since 0
	*/
	this.loadAll=function(game,callback){
		var mustLoad=game.config.mustLoad;
		for (var i=0;i<mustLoad.length;i++)
		{
			var resType=mustLoad[i].type;
			var resID=mustLoad[i].id;
			if (!!Name.Sivory.Opensea.RBuilders[resType])
			{
				var resourceBuilder=Name.Sivory.Opensea.RBuilders[resType];
				new resourceBuilder(game,resID);
			}
			else
			{
				throw "不支持的资源类型 ["+resType+"]";
			}
		}
		var resLoadCount=0;
		var handler=function(resource)
		{
			resLoadCount++;
			var p={loaded:resLoadCount,total:instance.loadingQueue.length}
			game.loader.process(p);//更新加载界面
			if (resLoadCount==instance.loadingQueue.length)
			{
				callback();
			}
		}
		for (var i=0;i<instance.loadingQueue.length;i++)
		{
			instance.loadingQueue[i].load(handler);
		}
	}
}

